﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.Web.Security;


namespace PizzaWic.cooker
{
    /// <summary>
    /// permet d'afficher la liste des commandes à réaliser
    /// </summary>
    public partial class DisplayCommand : System.Web.UI.Page
    {
        //liste des commandes contenant la liste des produits
        private static List<List<int>> myList = new List<List<int>>();
        //correspondance entre le numéro de la ligne du tableau et l'id_command
        private static Dictionary<int, int> corespondance = new Dictionary<int, int>();

        protected void Page_Load(object sender, EventArgs e)
        {
            
            if (!IsPostBack)
            {
                myList = new List<List<int>>();
                corespondance = new Dictionary<int, int>();
              
                init();
            }
        }

        private void init()
        {
            SqlAccess sql = new SqlAccess();
            DataSet dataSetCommand;
            DataSet dataSetProduct;

            //création du dataTable
            DataTable result = new DataTable();
            result.Columns.Add("numero_commande");
            result.Columns.Add("nom_pizza");
            result.Columns.Add("first");
            result.Columns.Add("id_product");

            //on récupère les commandes à réaliser
            dataSetCommand = sql.getCommandPending();

            //on parcours les commandes
            for (int i = 0; i < dataSetCommand.Tables[0].Rows.Count; i++)
            {
                //on récupère les produits de la commande
                dataSetProduct = sql.getProductByCommand(dataSetCommand.Tables[0].Rows[i][0]);
                int numCmd = (int)dataSetCommand.Tables[0].Rows[i][0];

                List<int> pizzas = new List<int>();
                //si la commande n'est pas encore affiché
                //on met à jour les references
                if (!corespondance.ContainsKey(numCmd))
                {
                    corespondance.Add(numCmd, i);
                    myList.Add(pizzas);
                }

                //on pracours les produits
                for (int j = 0; j < dataSetProduct.Tables[0].Rows.Count; j++)
                {
                    //on crée la linge du dataTable
                    DataRow dr = result.NewRow();
                    dr[0] = numCmd;
                    dr[1] = dataSetProduct.Tables[0].Rows[j][0];
                    dr[3] = dataSetProduct.Tables[0].Rows[j][1];

                    //si c'est le premier produit de la commande (permet de gérer l'affichage)
                    if (j == 0)
                        dr[2] = "true";
                    else
                        dr[2] = "false";

                    //on ajoute l'id du produit à la liste de la commande
                    pizzas.Add((int)dataSetProduct.Tables[0].Rows[j][1]);
                    result.Rows.Add(dr);
                }
            }
            
            //on charge le repeater
            this.repeaterCooker.DataSource = result;
            this.repeaterCooker.DataBind();
        }

        /// <summary>
        /// evenement lors du chargement des données dans les items du repeater
        /// </summary>
        public void repeaterCooker_dataBound(object sender, RepeaterItemEventArgs e)
        {

            if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType !=
                    ListItemType.AlternatingItem)
                return;

            HiddenField line = (HiddenField)e.Item.FindControl("firstLine");
            HtmlTableRow hta = (HtmlTableRow)e.Item.FindControl("line");

            //met à jour le style css si c'est la première ligne
            if (line.Value == "true")
            {
                hta.Attributes.Add("class", "firstLine");
            }
            else
            {
                hta.Attributes.Add("class", "normal");
            }

            //permet de masquer le bouton valider si la pizza est déjà validé
            Label numCmd = (Label)e.Item.FindControl("numCommande");
            HiddenField idPizza = (HiddenField)e.Item.FindControl("id_pizza");
            if (!myList[corespondance[int.Parse(numCmd.Text)]].Contains(int.Parse(idPizza.Value)))
                ((Button)e.Item.FindControl("buttonValidate")).Visible = false;
        }

        //lors de l'action sur le bouton pour valider le produit
        protected void itemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "validate_pizza")
            {
                SqlAccess sql = new SqlAccess();
                //on récupère les arguments de la commande
                string[] arguments = ((string)e.CommandArgument).Split(';');

                //on retire l'id_product de la liste
                myList[corespondance[int.Parse(arguments[0])]].Remove(int.Parse(arguments[1]));
                //on efface le bouton valider
                ((Button)e.Item.FindControl("buttonValidate")).Visible = false;
                
                //si c'est le dernier produit de la commande
                if (myList[corespondance[int.Parse(arguments[0])]].Count == 0)
                {
                    Object[] param = new Object[2];

                    //id du cooker pour valider la commande
                    param[0] = (int)Session["idCooker"];
                    param[1] = arguments[0];

                    //on valide la commande
                    sql.validateCommand(param);
                    //on réaffiche le tableau
                    init();
                }
            }
        }

        protected void Deconnexion_OnClick(object sender, EventArgs e)
        {
            FormsAuthentication.SignOut();
            Response.Redirect("..\\user\\HomePage.aspx");
        }
    }
}